home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
ldbmp08
/
ldbmp08s.lzh
/
LDBMP.S
< prev
next >
Wrap
Text File
|
1997-09-28
|
58KB
|
2,521 lines
*********************************************************************************
* BMP Loader <LDBMP.X Ver. 0.06> *
*********************************************************************************
.include doscall.mac
.include iocscall.mac
.include myconst.h
.xref _Bit1_prt
.xref _Rle4_extend
.xref _Bit4_prt
.xref _Bit4_scroll
.xref _Rle8_extend
.xref _Bit8_conv
.xref _Bit8_prt
.xref _Bit8_scroll
.xref _Bit8_rewrite
.xref _Bit16_conv
.xref _Bit24_conv
.xref _Bit24_prt
.xref _Bit24_scroll
.xref _Bit24_rewrite
.xref _Tone_down
.xref _Tone_up
.xref _Wait
.xdef pal_set0
.xdef scroll_int
.xdef gr_on0
.xdef gr_int0
.xdef gr_off0
.xdef key_chk
.xdef tenkey_chk
.xdef cursor_chk
.xdef mouse_chk
.xdef x_set
.xdef y_set
.xdef v_wait
.xdef inf_change
.xdef line_byte
.xdef tate
.xdef yoko
.xdef x_max
.xdef y_max
.xdef x_pos
.xdef y_pos
.xdef crt_y
.xdef os_type
.xdef iro
.xdef gr_addr
.xdef buff_addr
.xdef pal_addr
.xdef d_pat
.xdef fi_size
.xdef kflg
.xdef dflg
.xdef mflg
.xdef nflg
.xdef esc_flg
.xdef next_flg
.xdef resize_flg
.xdef inkey_flg3
.xdef scroll_key
.xdef s_dot4
.xdef s_dot8
.xdef s_dot24
WIN3 equ 40
OS2v1 equ 12
OS2v2 equ 64
file_header:
f_type: equ 0 *ファイル識別子 'BM'
f_size: equ 2 *ファイルのサイズ
f_reserved1: equ 6 *予備1
f_reserved2: equ 8 *予備2
f_offbits: equ 10 *ファイル先頭からイメージデータへのオフセット
WIN3_HED:
win3_size: equ 14 *これ大きさ (12:OS/2 1.x,40:Windows3.x,64:OS/2 2.x)
win3_width: equ 18 *横サイズ
win3_height: equ 22 *縦サイズ
win3_planes: equ 26 *使用プレーン数
win3_bitcount: equ 28 *色数 (1:2色,4:16色,8:256色,24:16777216色)
win3_comp: equ 30 *圧縮アルゴリズム (0:無圧縮,1:RLE8,2:RLE4)
win3_size_image equ 34 *イメージデータのサイズ
win3_xpels_pm: equ 38 *X方向のディスプレイ分解能
win3_ypels_pm: equ 42 *Y方向のディスプレイ分解能
win3_clr_used: equ 46 *色変換テーブルの大きさ
win3_clr_imp: equ 50 *重要な色の数
OS21_HED:
os21_size: equ 14 *これ大きさ (12:OS/2 1.x,40:Windows3.x,64:OS/2 2.x)
os21_width: equ 18 *横サイズ
os21_height: equ 20 *縦サイズ
os21_planes: equ 22 *使用プレーン数
os21_bitcount: equ 24 *色数 (1:2色,4:16色,8:256色,24:16777216色)
.text
.even
start:
lea.l mysp(pc),sp *スタックセット
move.l a0,-(sp) *a0とっておく
lea.l 16(a0),a0 *余分なメモリ開放
suba.l a0,a1
move.l a1,-(sp)
move.l a0,-(sp)
DOS _SETBLOCK
addq.l #8,sp
move.l (sp)+,a0 *a0戻す
bsr wait_path_set *waitデータのパス設定
bsr wait_read *waitデータの読み込み
bsr cmdchk *コマンドラインの解析
bsr buf_get *バッファ確保
bsr super *スーパーモードへ
bsr cursol_clr *カーソル消す
bsr name_get *ファイル名を取得し処理する
bsr user *ユーザモードへ
bsr buf_free *バッファ開放
bsr wait_write *waitデータの書き込み
bsr exit *終了処理
DOS _EXIT
*****************************************************************
* ファイル名を取得し、ファイルの読み込みを行う *
*****************************************************************
name_get:
clr.w file_cnt *ファイル数のカウント初期化
bsr chkname *ファイル名に対する前処理
bsr chkext *拡張子が省略されているかチェック
move.w #ARCHIVE,-(sp) *最初のファイルを検索する
pea.l arg(pc) *
pea.l filbuf(pc) *
DOS _FILES *
lea.l 10(sp),sp *
loop:
tst.l d0 *ファイルは見つかったか?
bmi done * 見つからなければ処理完了
bsr setpath *得られたファイル名を
* フルパスに再構成する
bsr main *メイン処理
tst.b esc_flg *エスケープ?
bne done
pea.l filbuf(pc) *つぎのファイルを検索する
DOS _NFILES *
addq.l #4,sp *
bra loop *繰り返す
done:
bsr rw_chk *画面の描き直し
bsr file_cnt_chk *処理したファイル数のチェック
rts
*****************************************************************
* files実行に先立ってファイル名に前処理を加える *
*****************************************************************
chkname:
pea.l nambuf(pc) *ファイル名を展開する
pea.l arg(pc) *
DOS _NAMECK *
addq.l #8,sp *
tst.l d0 *d0<0なら
bmi name_er * ファイル名の指定に誤りがある
beq nowild *d0=0ならワイルドカード指定なし
cmpi.w #$00ff,d0 *d0≠FFHなら
bne wild * ワイルドカード指定あり
noname: *ファイル名が指定されていない場合
lea.l arg(pc),a0 *バッファargに
lea.l nambuf(pc),a1 * nameckで展開したパス名+'*.BMP'
bsr strcpy * を再構成する
lea.l kome0(pc),a1 *
bsr strcpy *
wild: *ワイルドカードが指定された場合
*何もしなくてよい
cknam0:
rts
nowild: *ワイルドカードが指定されていない場合
move.w #SUBDIR,-(sp) *サブディレクトリであると仮定して
pea.l arg(pc) * 検索してみる
pea.l filbuf(pc) *
DOS _FILES *
lea.l 10(sp),sp *
tst.l d0 *見つかったか?
bmi cknam0 * 見つからなければファイルだろう
lea.l arg(pc),a0 *バッファargに
lea.l komekome(pc),a1 * もとのファイル名+'\*.BMP'
bsr strcat * を再構成する
bra chkname *nameckでファイル名を展開するために
* サブルーチン先頭に戻る
*****************************************************************
* files,nfilesで見付けたファイル名をフルパスに構成し直し *
* arg以降に格納する *
*****************************************************************
setpath:
lea.l arg(pc),a0 *a0=コピー先
lea.l nambuf(pc),a1 *a1=nameckで展開したパス名
bsr strcpy *コピーする
lea.l filbuf(pc),a1 *a1=files,nfilesで見付けたファイル名
lea.l 30(a1),a1
bsr strcpy *連結する
rts
*****************************************************************
* 文字列の連結および複写 *
* リターン時a0は文字列末の00Hを指す *
*****************************************************************
strcat:
tst.b (a0)+ *(a0)は0か?
bne strcat *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
strcpy:
move.b (a1)+,(a0)+ *1文字ずつ
bne strcpy *終了コードまでを転送する
subq.l #1,a0 *a0は進み過ぎている
*a0は文字列末の00Hを指す
rts
*****************************************************************
* 拡張子を補う *
*****************************************************************
chkext:
lea.l arg(pc),a0 *ファイル名のアドレス
lea.l dext(pc),a1 *拡張子のアドレス
chkext0:
cmp.b #".",(a0) *拡張子があるか
beq chkext2
tst.b (a0)+ *(a0)は0か?
bne chkext0 *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
chkext1:
move.b (a1)+,(a0)+ *1文字転送
bne chkext1 *終了コードまで繰り返す
chkext2:
rts
*****************************************************************
* コマンドラインのチェックを行う *
*****************************************************************
cmdchk:
lea.l arg(pc),a0 *a0=引数切り出し領域
addq.l #1,a2 *a2=コマンドライン文字列先頭
move.w #1,clr_mode *画面クリアモードの初期値
clr.w bit4_crtdef *16色BMPの画面モード初期値
clr.w x_pos *ロード座標の初期化
clr.w y_pos
cmdchk0:
bsr switch_chk *スイッチのチェック
tst.b (a2) *引数があるか?
beq usage *ないならファイル名が足りない
bsr getarg *ファイル名切り出し
bsr switch_chk *さらにスイッチのチェック
tst.b (a2) *引数があるか?
bne usage * あるなら引数が多い
cmdchk1:
rts
*****************************************************************
* スペースを飛ばしつぎの引数先頭までポインタを進め *
* スイッチがあれば処理してしまう *
*****************************************************************
switch_chk:
bsr skipsp *スペースをスキップする
tst.b (a2) *まだスイッチがあるか?
beq switch_chk2 *ないなら戻る(処理の振り分けを行う)
cmpi.b #'/',(a2) *引数の先頭が
beq switch_chk1 */,-であれば
cmpi.b #'-',(a2) * スイッチ
beq switch_chk1 *
bra switch_chk2 *スイッチでないなら戻る
switch_chk1:
addq.l #1,a2 *'/'や'-'の分ポインタを進める
tst.b (a2) *スイッチがあるか?
beq usage * ないなら使用方表示
move.b (a2)+,d0 *1文字取り出す
bsr toupper *大文字に変換しておく
cmpi.b #'K',d0 *Kスイッチ?
beq ksw * そうなら分岐
cmpi.b #'S',d0
beq ssw
cmpi.b #'C',d0
beq csw
cmpi.b #'L',d0
beq lsw
cmpi.b #'D',d0
beq dsw
cmpi.b #'M',d0
beq msw
cmpi.b #'F',d0
beq fsw
cmpi.b #'H',d0
beq hsw
cmpi.b #'W',d0
beq wsw
cmpi.b #'R',d0
beq rsw
cmpi.b #'N',d0
beq nsw
bra usage *無効なスイッチが指定された
ksw:
tst.b kflg *スイッチの二重指定チェック
bne usage
st kflg *KスイッチON
bra switch_chk *まだスイッチがあるかもしれない
ssw:
bsr ssw_ana
bra switch_chk
csw:
bsr csw_ana
bra switch_chk
lsw:
bsr lsw_ana
bra switch_chk
dsw:
tst.b dflg
bne usage
st dflg
bra switch_chk
msw:
tst.b mflg
bne usage
st mflg
bra switch_chk
fsw:
tst.b fflg
bne usage
st fflg
bra switch_chk
hsw:
tst.b hflg
bne usage
st hflg
bra switch_chk
wsw:
bsr wsw_ana
bra switch_chk
rsw:
tst.b rflg
bne usage
st rflg
bra switch_chk
nsw:
tst.b nflg
bne usage
st nflg
bra switch_chk
switch_chk2:
rts
*****************************************************************
* Sスイッチの解析 *
*****************************************************************
ssw_ana:
tst.b sflg *Sスイッチの2重指定
bne usage
st sflg
move.b (a2),d0 *1文字取り出す
cmp.b #' ',d0 *Sだけかな
beq ssw_ana9 *画面モードの指定なし
bsr num_read *
cmp.w crt_max(pc),d0 *
bhi usage
move.w d0,bit4_crtdef
subq.l #1,a2 *1文字戻す
ssw_ana9:
rts
*****************************************************************
* Cスイッチの解析 *
*****************************************************************
csw_ana:
tst.b cflg *Cスイッチの2重指定
bne usage
st cflg
move.b (a2),d0 *1文字取り出す
cmp.b #' ',d0 *Cだけかな
beq csw_ana9 *画面クリアモードの指定なし
bsr num_read
cmp.w #3,d0
bhi usage
move.w d0,clr_mode
subq.l #1,a2 *1文字戻す
csw_ana9:
rts
*****************************************************************
* Wスイッチの解析 *
*****************************************************************
wsw_ana:
tst.b wflg
bne usage
st wflg
move.b (a2),d0
cmp.b #' ',d0
beq usage
bsr num_read
cmp.w #4096,d0
bhi usage
move.w d0,_Wait
subq.l #1,a2
rts
*****************************************************************
* Lスイッチの解析 *
*****************************************************************
lsw_ana:
move.b (a2),d0 *1文字取り出す
bsr toupper *大文字に変換しておく
cmp.b #'C',d0 *LCかな
bne lsw_ana1
tst.b lflg *Lスイッチも指定している
bne usage
tst.b lcflg *LCスイッチの2重指定
bne usage
st lcflg *LCスイッチオン
addq.l #1,a2 *1文字進める
bra lsw_ana9
lsw_ana1:
cmp.b #' ',d0 *Lだけかな
bne lsw_ana2 *ロード座標を指定している
clr.w x_pos *ロード座標を0,0
clr.w y_pos
bra lsw_ana9
lsw_ana2:
bsr num_read *Xチェック
cmp.w #1023,d0 *Xが1023を越える時
bhi but_pos
move.w d0,x_pos
cmp.b #',',-1(a2)
bne usage
bsr num_read *Yチェック
cmp.w #1023,d0 *Yが1023を越える時
bhi but_pos
move.w d0,y_pos
st lflg *Lスイッチオン
subq.l #1,a2 *1文字戻す
lsw_ana9:
rts
*****************************************************************
* ファイル名を切り出す *
*****************************************************************
getarg:
move.l a0,-(sp) *{レジスタ待避
gtarg0: tst.b (a2) *1)文字列の終端コードか
beq gtarg1 *
cmpi.b #SPACE,(a2) *2)スペースか
beq gtarg1 *
cmpi.b #TAB,(a2) *3)タブか
beq gtarg1 *
* cmpi.b #'-',(a2) *4)ハイフンか
* beq gtarg1 *
cmpi.b #'/',(a2) *5)スラッシュ
beq gtarg1 *
move.b (a2)+,(a0)+ * が現れるまで転送を
bra gtarg0 * 繰り返す
gtarg1: clr.b (a0) *文字列終端コードを書き込む
movea.l (sp)+,a0 *}レジスタ復帰
rts
*****************************************************************
* スペース・TABをスキップする *
*****************************************************************
skipsp0:
addq.l #1,a2
skipsp:
cmpi.b #$20,(a2)
beq skipsp0
cmpi.b #$09,(a2)
beq skipsp0
rts
*****************************************************************
* 小文字→大文字変換ルーチン *
*****************************************************************
toupper:
cmpi.b #'a',d0
bcs toupr0
cmpi.b #'z'+1,d0
bcc toupr0
subi.b #$20,d0
toupr0:
rts
*****************************************************************
* 数字の解析 d0に数字を返す *
*****************************************************************
num_read:
clr.w d0
num_read0:
clr.w d1
move.b (a2)+,d1
sub.b #'0',d1
cmp.b #10,d1
bcc.b num_read1
mulu #10,d0
add.w d1,d0
bra.b num_read0
num_read1:
rts
*****************************************************************
* メイン処理 *
*****************************************************************
main:
lea.l arg(pc),a0 *ファイル名セット
bsr file_open *ファイルオープン
bsr file_size *ファイルサイズを調べる
move.l d6,fi_size *ファイルサイズセーブ
movea.l buff_addr(pc),a4 *バッファアドレス
moveq.l #14+64,d6 *読み込むサイズ
bsr file_read *ヘッダ部分を読む
bsr size_chk *画像サイズのチェック
tst.b skip_flg
bne main9
bsr line_byte_set *1ラインのバイト数を求める
bsr crtmode_set *画面モードの設定
bsr scroll_set *スクロール変数の設定
bsr lsw_chk *ロード座標・センタリングチェック
tst.b int_flg *1回目のグラフィック初期化ここで行う
bne main1
* bsr gr_off *グラフィック画面オフ
bsr scr_int *画面の初期化
bsr crtmode_int *画面モードの初期化
bsr scroll_int *スクロール座標の初期化
bsr gr_int *グラフィック画面の初期化チェック
main1:
move.l fi_size(pc),d6
sub.l #14+64,d6 *ヘッダ分縮める
movea.l buff_addr(pc),a4 *バッファに読み込む
lea.l 14+64(a4),a4
bsr file_read *ファイル読む
bsr file_close *ファイルクローズ
bsr henkan_chk *変換の必要な画像のチェック
tst.b int_flg *2回目以降のグラフィック初期化ここで行う
beq main3
* bsr gr_off *グラフィック画面オフ
bsr crtmode_int *画面モードの初期化
bsr scroll_int *スクロール座標の初期化
bsr gr_int *グラフィック画面の初期化チェック
main3:
bsr pal_set *パレット設定
bsr gr_on *グラフィック画面オン
bsr inf_mode *
bsr gr_prt *グラフィックを表示する
main8:
bsr scroll *グラフィックをスクロール
add.w #1,file_cnt *ファイル数のカウント+1
main9:
rts
*****************************************************************
* ファイルヘッダから画像サイズを求める *
*****************************************************************
size_chk:
movea.l buff_addr(pc),a0 *読み込んだデータの先頭
tst.b hflg
bne size_chk1
cmp.w #'BM',f_type(a0) *ファイル識別子はあっているか
beq size_chk1
bsr file_er *BMPファイルではない
bra size_chk8
size_chk1: *メモリチェック1
move.l fi_size(pc),d0
cmp.l buff_size(pc),d0
bls size_chk2
bra mem_chk5
size_chk2:
move.l win3_size(a0),d0 *BMPの種類
bsr i_to_m
move.w d0,os_type
cmp.b #12,d0 *OS/2 1.x
beq os21_chk
cmp.b #40,d0 *Win 3.x
beq win3_chk
cmp.b #64,d0 *OS/2 2.x
beq win3_chk *Win3チェックで動くと思う
* bsr no_win3_err
bsr no_support_err
bra size_chk8
*****************************************************************
* OS/2 1.xのサイズを求める *
*****************************************************************
os21_chk:
move.w os21_planes(a0),d0 *使用プレーン数は1か
ror.w #8,d0
cmp.b #1,d0
beq os21_chk0
bsr no_support_err
bra size_chk8
os21_chk0:
move.w os21_bitcount(a0),d0 *使用色数GET
ror.w #8,d0
move.w d0,iro
cmp.w #1,d0 *2
beq os21_chk1
cmp.w #4,d0 *16
beq os21_chk1
cmp.w #8,d0 *256
beq os21_chk1
cmp.w #24,d0 *Full
beq os21_chk1
bsr but_col_err *それ以外は無視*
bra size_chk8
os21_chk1:
move.w os21_width(a0),d0 *横ドット数求める
ror.w #8,d0
move.w d0,yoko
move.w os21_height(a0),d0 *縦ドット数求める
ror.w #8,d0
move.w d0,tate
cmp.w #24,iro
beq os21_chk2
move.l f_offbits(a0),d0 *パレット数を求める
bsr i_to_m
move.l d0,d1
move.l os21_size(a0),d0
bsr i_to_m
sub.l d0,d1
sub.l #14,d1
divu.w #3,d1 *おそい
move.w d1,pal_cnt
lea.l os21_size(a0),a0 *パレットの先頭アドレスを求める
move.l (a0),d0
bsr i_to_m
add.l d0,a0
move.l a0,pal_addr
move.w pal_cnt(pc),d0 *グラフィックデータの先頭アドレスを求める
move.w d0,d1 *パレット分たす
add.w d0,d0
add.w d1,d0
add.w d0,a0
bra os21_chk3
os21_chk2:
move.l f_offbits(a0),d0
bsr i_to_m
add.l d0,a0
os21_chk3:
move.l a0,gr_addr *グラフィックの先頭アドレス
move.w #0,compress
bra mem_chk
*****************************************************************
* WIN3.xのサイズを求める *
*****************************************************************
win3_chk:
move.w win3_planes(a0),d0 *使用プレーン数は1か
ror.w #8,d0
cmp.b #1,d0
beq win3_chk1
bsr no_support_err
bra size_chk8
win3_chk1:
move.w win3_bitcount(a0),d0 *使用色数GET
ror.w #8,d0
move.w d0,iro
cmp.w #1,d0 *2
beq win3_chk2
cmp.w #4,d0 *16
beq win3_chk2
cmp.w #8,d0 *256
beq win3_chk2
cmp.w #16,d0 *32k
beq win3_chk2
cmp.w #24,d0 *Full
beq win3_chk2
bsr but_col_err *それ以外は無視*
bra size_chk8
win3_chk2:
move.l win3_comp(a0),d0 *圧縮モード
bsr i_to_m
move.w d0,compress
move.l win3_width(a0),d0 *横ドット数求める
bsr i_to_m
move.w d0,yoko
move.l win3_height(a0),d0 *縦ドット数求める
bsr i_to_m
move.w d0,tate
cmp.w #24,iro *フルカラーの時
beq win3_chk3
move.l f_offbits(a0),d0 *パレット数を求める
bsr i_to_m
move.l d0,d1
move.l win3_size(a0),d0
bsr i_to_m
sub.l d0,d1
sub.l #14,d1
lsr.l #2,d1
move.w d1,pal_cnt
lea.l win3_size(a0),a0 *パレットの先頭アドレスを求める
move.l (a0),d0
bsr i_to_m
add.l d0,a0
move.l a0,pal_addr
move.w pal_cnt(pc),d0 *グラフィックデータの先頭アドレスを求める
add.w d0,d0 *パレット分たす
add.w d0,d0
add.w d0,a0
move.l a0,gr_addr
bra mem_chk
win3_chk3:
move.l f_offbits(a0),d0
bsr i_to_m
add.l d0,a0
move.l a0,gr_addr *変換後画像アドレス
mem_chk:
cmp.w #1,compress *展開するメモリがあるか
bcs mem_chk0 *normal
beq mem_chk1 *rle8
bhi mem_chk2 *rle4
mem_chk0:
moveq.l #0,d0
bra mem_chk3
mem_chk1:
move.w yoko(pc),d0
addq.w #3,d0
andi.w #$fffc,d0
mulu.w tate(pc),d0
bra mem_chk3
mem_chk2:
move.w yoko(pc),d0
addq.w #1,d0
lsr.l #1,d0
addq.w #3,d0
and.w #$fffc,d0
mulu.w tate(pc),d0
mem_chk3:
cmp.w #8,iro *256色データを32kデータに
beq mem_chk4 * 変換するメモリがあるか
tst.b fflg
beq mem_chk4
move.w yoko(pc),d1
add.w d1,d1
mulu.w tate(pc),d1
add.w d1,d0
mem_chk4:
add.l fi_size(pc),d0
cmp.l buff_size(pc),d0
bls size_chk9
mem_chk5:
bsr no_buff
size_chk8: *スキップする画像の時
bsr file_close
st skip_flg
rts
size_chk9:
clr.b skip_flg
rts
i_to_m:
ror.w #8,d0
swap.w d0
ror.w #8,d0
rts
*****************************************************************
* 1ラインのバイト数を求める *
*****************************************************************
line_byte_set:
move.w iro(pc),d0
cmp.w #4,d0
bcs lb_set1
beq lb_set4
cmp.w #16,d0
bcs lb_set8
beq lb_set16
bhi lb_set24
lb_set1:
move.w yoko(pc),d0
add.w #31,d0
lsr.w #3,d0
and.w #$fffc,d0
move.w d0,line_byte
bra line_byte_set9
lb_set4:
move.w yoko(pc),d0
addq.w #7,d0
lsr.w #1,d0
and.w #$fffc,d0
move.w d0,line_byte
bra line_byte_set9
lb_set8:
move.w yoko(pc),d0
addq.w #3,d0
andi.w #$fffc,d0
move.w d0,line_byte
bra line_byte_set9
lb_set16:
move.w yoko(pc),d0
add.w d0,d0
addq.w #3,d0
and.w #$fffc,d0
move.w d0,line_byte
bra line_byte_set9
lb_set24:
move.w yoko(pc),d0
move.w d0,d1
add.w d1,d1
add.w d1,d0
addq.w #3,d0
and.w #$fffc,d0
move.w d0,line_byte
line_byte_set9:
rts
*****************************************************************
* ロード座標のチェック *
*****************************************************************
lsw_chk:
tst.b lflg *Lスイッチ指定
bne l_chk *指定あり
tst.b lcflg *LCスイッチ指定
bne lc_chk *指定あり
rts
l_chk:
cmpi.w #4,iro *16色は特別(手抜き)
beq l_chk5
move.w x_pos(pc),d0 *横にはみ出るか
beq l_chk1
add.w yoko(pc),d0
cmp.w crt_x(pc),d0
bhi but_pos *はみ出る
l_chk1
move.w y_pos(pc),d0 *縦にはみ出るか
beq l_chk2
add.w tate(pc),d0
cmp.w crt_y(pc),d0
bhi but_pos *はみ出る
l_chk2
rts
l_chk5
move.w x_pos(pc),d0
beq l_chk6
add.w yoko(pc),d0
cmp.w #1024,d0
bhi but_pos
l_chk6
move.w y_pos(pc),d0
beq l_chk7
add.w tate(pc),d0
cmp.w #1024,d0
bhi but_pos
l_chk7
rts
lc_chk:
clr.w x_pos *ロード座標を初期化
clr.w y_pos
move.w crt_x(pc),d0 *X方向のセンタリング
sub.w yoko(pc),d0
bmi lc_chk1
lsr.w #1,d0 *d0を1/2
move.w d0,x_pos
lc_chk1:
move.w crt_y(pc),d0 *Y方向のセンタリング
sub.w tate(pc),d0
bmi lc_chk2
lsr.w #1,d0 *d0を1/2
move.w d0,y_pos
lc_chk2:
rts
*****************************************************************
* スクロール画面の初期化 *
*****************************************************************
scroll_int:
clr.w d2 *スクロール座標初期化
clr.w d3
bsr x_set
bsr y_set
rts
*****************************************************************
* 画面モードの設定 *
*****************************************************************
crtmode_set:
move.w iro(pc),d0
cmp.w #8,d0
bcs crtmode_set1
beq crtmode_set2
bra crtmode_set3
crtmode_set1: *2・16色
move.w bit4_crtdef(pc),crt_mode
move.w #$04,vctr_r0
move.w #$30,vctr_r2
bra crtmode_set4
crtmode_set2: *256色
tst.b fflg
bne crtmode_set3
move.w #5,crt_mode
move.w #$01,vctr_r0
move.w #$23,vctr_r2
bra crtmode_set4
crtmode_set3: *32k・1677色(Full)
move.w #6,crt_mode
move.w #$03,vctr_r0
move.w #$2f,vctr_r2
* bra crtmode_set4
crtmode_set4:
rts
*****************************************************************
* スクロール変数の設定 *
*****************************************************************
scroll_set:
lea.l dot_tbl(pc),a0 *ドット数テーブル
move.w crt_mode(pc),d0
add.w d0,d0
add.w d0,d0
move.l 0(a0,d0.w),a0
move.w (a0),crt_x *CRTのXドット数
move.w 2(a0),crt_y * Yドット数
move.w yoko(pc),d0 *横スクロール出来るドット数を計算
sub.w crt_x(pc),d0
bpl scroll_set0
clr.w d0
scroll_set0:
move.w d0,x_max
move.w tate(pc),d0 *縦スクロール出来るドット数を計算
sub.w crt_y(pc),d0
bpl scroll_set1
clr.w d0
scroll_set1:
move.w d0,y_max
cmp.w #4,iro *16色以下か
bhi scroll_set4 *違う
scroll_set2: *実画面スクロールのみ
move.w #1024,d0
sub.w crt_x(pc),d0
cmp.w x_max(pc),d0
bcc scroll_set3
move.w d0,x_max
scroll_set3:
move.w #1024,d0
sub.w crt_y(pc),d0
cmp.w y_max(pc),d0
bcc scroll_set4
move.w d0,y_max
scroll_set4:
rts
*****************************************************************
* 画面の初期化を行う *
*****************************************************************
scr_int:
st int_flg *画面の初期化は一回だけ
move.w clr_mode(pc),d0 *テキスト画面消去の指定があるか
btst.l #0,d0
beq scr_int9 *指定無し
IOCS _MS_CUROF *マウスカーソル消す
moveq.l #0,d1 *ソフトキーボード消す
moveq.l #0,d2
IOCS _SKEY_MOD
bsr func_off *ファンクションキー消す
bsr text_clr *テキストクリア
move.w #$1e,d1 *カーソルをHOMEポジションへ
IOCS _B_PUTC
scr_int9:
rts
*****************************************************************
* 画面のモードの初期化を行う *
*****************************************************************
crtmode_int:
move.w vctr_r0(pc),$e82400 *色モード・実画面サイズ設定
move.w #$06e4,$e82500 *画面の優先順位
cmp.w #2,clr_mode *グラフィック画面消去の指定
bcs crtmode_int1 *指定無し
move.w #$0020,$e82600 *GRoff・TEXTon
bra crtmode_int2
crtmode_int1:
move.w vctr_r2(pc),$e82600 *GRon・TEXTon
crtmode_int2:
bsr v_wait
bsr crtc_set *crtcレジスタ設定
rts
*****************************************************************
* グラフィック画面の消去 *
*****************************************************************
gr_int:
cmp.w #2,clr_mode *グラフィック画面消去の指定が無い時は無視
bcs gr_int9 *指定無し
gr_int0:
tst.b mflg
bne gr_int1 *強制MPUクリア
cmp.w #4,iro *16色以下か
bhi gr_int3 *違う
move.w yoko(pc),d0
cmp.w crt_x(pc),d0
bhi gr_int1
move.w tate(pc),d0
cmp.w crt_y(pc),d0
bcs gr_int3
gr_int1:
move.w $e80028,-(sp)
movem.l d0-d7/a0-a6,-(sp)
move.b #3,$e80028
moveq.l #0,d0 *レジスタクリア
move.l d0,d1
move.l d0,d2
move.l d0,d3
move.l d0,d4
move.l d0,d5
move.l d0,d6
move.l d0,d7
movea.l d0,a1
movea.l d0,a2
movea.l d0,a3
movea.l d0,a4
movea.l d0,a5
movea.l d0,a6
movea.l #GRAM_MAX,a0
move.w #512,line_cnt
gr_int2:
movem.l d0-d7/a1-a6,-(a0) *14*4=56
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d3,-(a0)
subq.w #1,line_cnt
bne gr_int2
movem.l (sp)+,d0-d7/a0-a6
move.w (sp)+,$e80028
bra gr_int9
gr_int3:
move.w $e8002a,-(sp) *ハードウェアクリア
bsr v_wait
move.w #$0f,$e8002a
move.b #$02,$e80481
bsr v_wait
move.w (sp)+,$e8002a
gr_int9:
rts
*****************************************************************
* グラフィックのオン *
*****************************************************************
gr_on:
cmp.w #2,clr_mode *グラフィック画面消去の指定が無い時は無視
bcs gr_on1
gr_on0:
bsr v_wait
* ori.w #$003f,$e82600 *GRon・TEXTon
move.w vctr_r2(pc),d0 *GRon・TEXTon
or.w d0,$e82600 *GRon・TEXTon
gr_on1:
rts
*****************************************************************
* グラフィックのオフ *
*****************************************************************
gr_off:
cmp.w #2,clr_mode *グラフィック画面消去の指定が無い時は無視
bcs gr_off1
gr_off0:
bsr v_wait
andi.w #$ffe0,$e82600 *GRoff
gr_off1:
rts
*****************************************************************
* パレットデータの設定 *
*****************************************************************
pal_set:
cmp.w #5,crt_mode *256色モードより大か
bhi pal_set2 *そう
movea.l pal_addr(pc),a0 *パレットの先頭アドレス
move.l #GPAL,a1 *パレットアドレス
pal_set0:
move.w pal_cnt(pc),d0 *パレット数
cmp.w #256,d0
bls pal_set1
move.w #256,d0
pal_set1:
subq.w #1,d0
move.w #$00f8,d7 *マスクデータ
cmp.w #OS2v1,os_type
bne ps_win3
ps_os2v1:
move.b (a0)+,d1 *B
move.b (a0)+,d2 *G
move.b (a0)+,d3 *R
and.w d7,d1
and.w d7,d2
and.w d7,d3
lsr.w #2,d1
lsl.w #3,d3
lsl.w #8,d2
or.w d2,d1
or.w d3,d1
move.w d1,(a1)+
dbra d0,ps_os2v1
rts
ps_win3:
move.b (a0)+,d1 *B
move.b (a0)+,d2 *G
move.b (a0)+,d3 *R
addq.w #1,a0
and.w d7,d1
and.w d7,d2
and.w d7,d3
lsr.w #2,d1
lsl.w #3,d3
lsl.w #8,d2
or.w d2,d1
or.w d3,d1
move.w d1,(a1)+
dbra d0,ps_win3
rts
pal_set2: *65536色標準パレット
moveq.l #$0001,d0
move.l #$0202,d1
movea.l #GPAL,a0
moveq.l #512/4-1,d2
pal_set3:
move.w d0,(a0)+
move.w d0,(a0)+
add.l d1,d0
dbra d2,pal_set3
pal_set4:
rts
*****************************************************************
* 変換の必要な画像のチェック *
*****************************************************************
henkan_chk:
cmp.w #1,compress
bcs henkan_chk3 *normal
beq henkan_chk2 *rle8
bhi henkan_chk1 *rle4
henkan_chk1:
bsr _Rle4_extend
bra henkan_chk9
henkan_chk2:
bsr _Rle8_extend
* bra henkan_chk9
henkan_chk3:
cmp.w #8,iro
bcs henkan_chk9
bhi henkan_chk4
tst.b fflg *通常表示か
beq henkan_chk9
bsr _Bit8_conv *32k表示
bra henkan_chk9
henkan_chk4:
cmp.w #16,iro *32k,fullカラーは先に変換しておく
bhi henkan_chk5
bsr _Bit16_conv
bra henkan_chk9
henkan_chk5:
bsr _Bit24_conv
* bra henkan_chk9
henkan_chk9:
rts
*****************************************************************
* グラフィックを表示する *
*****************************************************************
gr_prt:
move.w iro(pc),d0
cmp.w #4,d0
bcs bit1_prt
beq bit4_prt
cmp.w #8,d0
beq bit8_prt
bhi bit24_prt
bit1_prt:
bsr _Bit1_prt
bra gr_prt9
bit4_prt:
bsr _Bit4_prt
bra gr_prt9
bit8_prt:
tst.b fflg
bne bit24_prt
bsr _Bit8_prt
bra gr_prt9
bit24_prt:
bsr _Bit24_prt
* bra gr_prt9
gr_prt9:
rts
*****************************************************************
* グラフィックを描き直す *
*****************************************************************
rw_chk:
tst.b rflg
beq rw_end
move.w d2,d0
add.w d3,d0
beq rw_end
tst.b skip_flg
bne rw_end
tst.b resize_flg
bne rw_end
move.w iro(pc),d0
cmp.w #8,d0
bcs rw_end
bhi rw_chk24
rw_chk8:
tst.b fflg
bne rw_chk24
bsr _Bit8_rewrite
bra rw_end
rw_chk24:
bsr _Bit24_rewrite
rw_end:
rts
*****************************************************************
* ファイルのOPENを行う *
*****************************************************************
file_open:
move.w #0,-(sp) *ファイルopen
move.l a0,-(sp)
DOS _OPEN
addq.l #6,sp
tst.l d0 *OK?
bmi open_err
move.l d0,d7 *ファイルハンドルセーブ
rts
*****************************************************************
* ファイルのサイズを求める(d6に返す) *
*****************************************************************
file_size:
move.w #2,-(sp)
move.l #0,-(sp)
move.w d7,-(sp)
DOS _SEEK
addq.l #8,sp
tst.l d0 *OK?
bmi read_err
move.l d0,d6
move.w #0,-(sp)
move.l #0,-(sp)
move.w d7,-(sp)
DOS _SEEK
addq.l #8,sp
tst.l d0 *OK?
bmi read_err
rts
*****************************************************************
* ディスクからデータの読み込みを行う *
*****************************************************************
file_read:
move.l d6,-(sp) *データサイズ
move.l a4,-(sp) *バッファアドレス
move.w d7,-(sp) *ファイルハンドル
DOS _READ
lea 10(sp),sp *スタック補正
tst.l d0 *OK?
bmi read_err
cmp.l d6,d0 *全部読めたか
bne read_err
rts
*****************************************************************
* ファイルをCLOSEする *
*****************************************************************
file_close:
move.w d7,-(sp) *ファイルCLOSE
DOS _CLOSE
addq.l #2,sp
rts
*****************************************************************
* スクロール制御 *
*****************************************************************
scroll:
sf esc_flg
sf next_flg
sf resize_flg
sf inkey_flg1
sf inkey_flg2
sf inkey_flg3
move.w iro(pc),d0
cmp.w #8,d0
bcs bit4_scroll
beq bit8_scroll
bhi bit24_scroll
bit4_scroll:
bsr _Bit4_scroll
bra scroll9
bit8_scroll:
tst.b fflg
bne bit24_scroll
bsr _Bit8_scroll
bra scroll9
bit24_scroll:
bsr _Bit24_scroll
* bra scroll9
scroll9:
rts
*****************************************************************
* キー入力チェック *
*****************************************************************
key_chk:
movea.w #$800,a0
btst.b #1,(a0) *ESCが押されたか?
beq key_chk_ *押されていない
st esc_flg *ESCスイッチON
bra key_chk9
key_chk_:
btst.b #7,1(a0) *BSが押されたか?
beq key_chk0 *押されていない
st esc_flg *ESCスイッチON
bra key_chk9
key_chk0:
btst.b #5,3(a0) *RETURNが押されたか?
beq key_chk1 *押されていない
st next_flg *NEXTスイッチON
bra key_chk9
key_chk1:
btst.b #5,6(a0) *SPACEが押されたか?
beq key_chk2
st next_flg
bra key_chk9
key_chk2:
btst.b #6,9(a0) *ENTERが押されたか?
beq key_chk3
st next_flg
bra key_chk9
key_chk3:
btst.b #6,6(a0) *HOMEが押されたか?
beq key_chk4
tst.b inkey_flg1
bne key_chk9
st inkey_flg1
bsr inf_change *情報表示の変更
bra key_chk9
key_chk4:
btst.b #2,7(a0) *UNDOが押されたか?
beq key_chk8
tst.b inkey_flg1
bne key_chk9
st inkey_flg1
not.b resize_flg
bra key_chk9
key_chk8:
sf inkey_flg1
key_chk9:
rts
*****************************************************************
* カーソル入力チェック *
*****************************************************************
cursor_chk:
movea.w #$807,a0 *カーソルキーのチェック
move.b (a0),d0
ror.b #3,d0
andi.w #$000f,d0
move.b d0,scroll_key
rts
*****************************************************************
* テンキー入力チェック *
*****************************************************************
tenkey_chk:
movea.w #$808,a0
lea.l scroll_key(pc),a1
btst.b #4,(a0) *8押されたか?
beq tenkey_chk0 *押されていない
or.b #2,(a1) *上セット
tenkey_chk0:
btst.b #7,(a0) *4が押されたか?
beq tenkey_chk1 *押されていない
or.b #1,(a1) *右セット
tenkey_chk1:
movea.w #$809,a0
btst.b #1,(a0) *6が押されたか?
beq tenkey_chk2 *押されていない
or.b #4,(a1) *左セット
tenkey_chk2:
btst.b #4,(a0) *2が押されたか?
beq tenkey_chk3 *押されていない
or.b #8,(a1) *下セット
tenkey_chk3:
rts
*****************************************************************
* マウスの入力チェック *
*****************************************************************
mouse_chk:
IOCS _MS_GETDT *マウスからのデータをGET
cmpi.b #$ff,d0 *右ボタンが押されたか
beq mouse_right *押された
andi.w #$ff00,d0 *左ボタンが押されたか
bne mouse_left *押された
sf inkey_flg2
bra mouse_chk1
mouse_right:
andi.w #$ff00,d0 *更に左ボタンが押されたか
bne mouse_right1 *押された
tst.b inkey_flg2
bne mouse_right0
st inkey_flg2
bsr inf_change *情報表示の変更
mouse_right0:
IOCS _MS_GETDT *マウスからのデータをGET
andi.w #$ff00,d0 *左ボタンが押されたか
beq mouse_chk1 *押されていない
mouse_right1:
st esc_flg *ESCスイッチON
bra mouse_chk1
mouse_left:
st next_flg *NEXTスイッチON
mouse_chk1:
swap d0
move.w d0,d1
andi.w #$ff00,d0 *上位を残す
andi.w #$00ff,d1 *下位を残す
ror.w #8,d0 *
lea.l scroll_key(pc),a1
ms_xp: *X方向の移動量を調べる
tst.b d0 *移動量がプラス方向か?
beq ms_yp *入力なし
blt ms_xm *マイナスなら飛ぶ
cmp.b #1,d0
bls ms_yp *移動量が少なければ無視
or.b #4,(a1) *右セット
bra ms_yp
ms_xm:
cmp.b #-1,d0
bcc ms_yp
or.b #1,(a1) *左セット
* bra ms_yp
ms_yp: *Y方向の移動量を調べる
tst.b d1 *移動量がプラス方向か?
beq mouse_chk9 *入力なし
blt ms_ym *マイナスなら飛ぶ
cmp.b #1,d1
bls mouse_chk9 *移動量が少なければ無視
or.b #8,(a1) *下セット
bra mouse_chk9
ms_ym:
cmp.b #-1,d1
bcc mouse_chk9
or.b #2,(a1) *上セット
* bra mouse_chk9
mouse_chk9:
rts
*****************************************************************
* CRTCの値を設定する *
*****************************************************************
crtc_set:
lea.l crtc_tbl(pc),a0
move.w crt_mode(pc),d0
add.w d0,d0
add.w d0,d0
move.l 0(a0,d0.w),a0
tst.w (a0)+ *HRL=0?
beq crtc_set0
or.b #%0010,$e8e007 *HRLビットを立てる
bra crtc_set1
crtc_set0:
bclr.b #1,$e8e007 *HRLビットを消す
crtc_set1:
movea.l #$e80000,a1
move.w (a0)+,$28(a1) *crtc r20
move.l (a0)+,(a1)+ *crtc r00-r08
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.w (a0),(a1)
rts
*****************************************************************
* 情報の表示/非表示の変更を行う *
*****************************************************************
inf_change:
add.b #1,prt_flg
cmp.b #2,prt_flg
bcs inf_change1
beq inf_change2
bra inf_change0
inf_change0:
bsr inf_off *情報消去
bsr _Tone_up
clr.b prt_flg
bra inf_change9
inf_change1:
bsr inf_prt *情報表示
bra inf_change9
inf_change2:
bsr _Tone_down
inf_change9:
rts
inf_mode:
cmp.b #1,prt_flg
bcs inf_mode9
beq inf_mode1
bra inf_mode2
inf_mode1:
bsr inf_prt *情報表示
bra inf_mode9
inf_mode2:
bsr inf_prt *情報表示
bsr _Tone_down
inf_mode9:
rts
*****************************************************************
* 情報の表示 *
*****************************************************************
inf_prt:
tst.b prt_flg
beq inf_prt9 *ゼロなら表示しない
bsr v_wait
bsr inf_off
bsr name_prt *ファイル名の表示
bsr size_prt *サイズの表示
bsr col_prt *色数の表示
inf_prt9:
rts
*****************************************************************
* ファイル名の表示 *
*****************************************************************
name_prt:
lea.l prt_buf(pc),a0 *表示バッファの先頭アドレス
lea.l inf1(pc),a1 *'ファイル名:'をコピー
bsr strcpy
lea.l filbuf(pc),a1 *ファイル名をコピーする
lea.l 30(a1),a1 *
bsr strcpy
lea.l crlf_mes(pc),a1 *改行コードをコピー
bsr strcpy
lea.l prt_buf(pc),a1
IOCS _B_PRINT *ファイル名を表示
rts
*****************************************************************
* 画像サイズの表示 *
*****************************************************************
size_prt:
lea.l prt_buf(pc),a0 *コピー先
lea.l inf2(pc),a1 *'画像サイズ:'をコピー
bsr strcpy
movea.l a0,a2
moveq.l #0,d0 *横サイズ
move.w yoko(pc),d0
bsr suji_set
move.b #'x',(a2)+ *'x'
moveq.l #0,d0 *縦サイズ
move.w tate(pc),d0
bsr suji_set
movea.l a2,a0
lea.l crlf_mes(pc),a1 *改行コードをコピー
bsr strcpy
lea.l prt_buf(pc),a1
IOCS _B_PRINT *画像サイズを表示
rts
*****************************************************************
* 色数の表示 *
*****************************************************************
col_prt:
lea.l prt_buf(pc),a0 *コピー先
lea.l inf3(pc),a1 *'色数 :'をコピー
bsr strcpy
move.w iro(pc),d0
cmp.w #1,d0 *2色
beq col_1
cmp.w #4,d0 *16色
beq col_4
cmp.w #8,d0 *256色
beq col_8
cmp.w #16,d0 *32k色
beq col_16
cmp.w #24,d0 *Full color(16777216)
beq col_24
bra col_?? *不明
col_1:
lea.l col1(pc),a1
bra col_set
col_4:
lea.l col4(pc),a1
bra col_set
col_8:
lea.l col8(pc),a1
bra col_set
col_16:
lea.l col16(pc),a1
bra col_set
col_24:
lea.l col24(pc),a1
bra col_set
col_??:
lea.l col??(pc),a1
* bra col_set
col_set
bsr strcpy *色数をコピー
lea.l crlf_mes(pc),a1 *改行コードをコピー
bsr strcpy
lea.l prt_buf(pc),a1
IOCS _B_PRINT *色数を表示
rts
*****************************************************************
* 数字の設定 *
*****************************************************************
suji_set:
lea.l num_buf(pc),a0
move.b #0,11(a0) *終了位置
bsr bin2dec
bsr zero_keshi
suji_set1:
move.b (a0)+,(a2)+
bne suji_set1
subq.l #1,a2
rts
*****************************************************************
* 2進=>10進 *
* d0 変換元の数値 a0 変換後の格納アドレス *
*****************************************************************
bin2dec:
movem.l d0-d3/a0-a1,-(sp)
moveq.l #10-1,d1
lea.l exp_tbl(pc),a1
bin2dec0:
clr.b d2
move.l (a1)+,d3
bin2dec1:
or d3,d3
sub.l d3,d0
bcs bin2dec2
addq.b #1,d2
bra bin2dec1
bin2dec2:
add.l d3,d0
add.b #'0',d2
move.b d2,(a0)+
dbra d1,bin2dec0
movem.l (sp)+,d0-d3/a0-a1
rts
exp_tbl:
.dc.l 1000000000
.dc.l 100000000
.dc.l 10000000
.dc.l 1000000
.dc.l 100000
.dc.l 10000
.dc.l 1000
.dc.l 100
.dc.l 10
.dc.l 1
*****************************************************************
* 頭にある'0'を消す *
*****************************************************************
zero_keshi:
lea.l num_buf(pc),a0
move.w #9-1,d0 *最期の'0'は残す
zero_keshi0:
cmp.b #'0',(a0)
bne zero_keshi9
move.b #SPACE,(a0)+
zero_keshi1:
dbra d0,zero_keshi0
zero_keshi9:
rts
*****************************************************************
* 情報の消去 *
*****************************************************************
inf_off:
move.w #$1a,d1 *TEXTクリア&HOMEポジションへ
IOCS _B_PUTC
rts
*****************************************************************
* スクロールX座標セット *
*****************************************************************
x_set:
movea.l #$e80000,a0
move.w d2,d0 *X座標
move.w d0,crtc_r12(a0)
move.w d0,crtc_r14(a0)
cmp.w #5,crt_mode *256色モード
bne x_set1
add.w #256,d0 *page1のX座標(256色)
x_set1:
move.w d0,crtc_r16(a0)
move.w d0,crtc_r18(a0)
rts
*****************************************************************
* スクロールY座標セット *
*****************************************************************
y_set:
movea.l #$e80000,a0
move.w d3,crtc_r13(a0) *スクリーン0のY座標
move.w d3,crtc_r15(a0) *スクリーン1のY座標
move.w d3,crtc_r17(a0) *スクリーン2のY座標
move.w d3,crtc_r19(a0) *スクリーン3のY座標
rts
*****************************************************************
* 画面の動機待ち *
*****************************************************************
v_wait:
movea.l #$e88001,a0
moveq.l #4,d0
v_wait0:
btst.b d0,(a0)
beq v_wait0
v_wait1:
btst.b d0,(a0)
bne v_wait1
rts
*****************************************************************
* テキスト画面の消去 *
*****************************************************************
text_clr:
movem.l d0-d3/a3,-(sp)
move.w $E8002A,d0
move.w #%0000_0001_1111_0000,$E8002A
movea.l #TEXT1,a3
move.w #1024-1,d1
text_clr_lp:
clr.l (a3)+
dbra.w d1,text_clr_lp
move.w d0,$E8002A
move.w #$0001,d1
move.w #255,d2
move.w #$000F,d3
IOCS _TXRASCPY
movem.l (sp)+,d0-d3/a3
rts
*****************************************************************
* waitデータのパス名を設定 *
*****************************************************************
wait_path_set:
lea.l $80(a0),a1 *転送元
lea.l arg2(pc),a0 *転送先
bsr strcpy
lea.l wait_name(pc),a1 *指定したファイル名
bsr strcpy
rts
*****************************************************************
* waitデータ'bmp256.dat'を読み込む *
*****************************************************************
wait_read:
move.w #0,-(sp) *ファイルopen
pea.l arg2(pc)
DOS _OPEN
addq.l #6,sp
tst.l d0 *OK?
bmi wait_read9
move.l d0,d7 *ファイルハンドルセーブ
move.l #2,-(sp) *データサイズ
pea.l _Wait(pc) *バッファアドレス
move.w d7,-(sp) *ファイルハンドル
DOS _READ
lea 10(sp),sp *スタック補正
* tst.l d0 *OK?
* bmi read_err
* cmp.l d6,d0 *全部読めたか
* bne read_err
bsr file_close
tst.b wflg */W指定ならスキップ
bne wait_read9
move.w _Wait(pc),wait
wait_read9:
rts
*****************************************************************
* waitデータ'bmp256.dat'を書き込む *
*****************************************************************
wait_write:
move.w wait(pc),d0
cmp.w _Wait(pc),d0
beq wait_write9
move.w #$20,-(sp) *ファイルCREATE
pea.l arg2(pc)
DOS _CREATE
addq.l #6,sp
* tst.l d0
* bmi create_err
tst.l d0
bmi wait_write9
move.l d0,d7 *ファイルハンドルセーブ
move.l #2,-(sp) *データサイズ
pea.l _Wait(pc) *バッファアドレス
move.w d7,-(sp) *ファイルハンドル
DOS _WRITE
lea.l 10(sp),sp *スタック補正
* tst.l d0 *OK?
* bmi write_err
* cmp.l d6,d0 *全部書き込めたか?
* bne write_err
bsr file_close
lea.l wait_change_mes(pc),a0
bsr mesput
wait_write9:
rts
*****************************************************************
* カーソル消す *
*****************************************************************
cursol_clr:
move.b $992.w,cur_save
beq cursol_clr9
IOCS _OS_CUROF
cursol_clr9:
rts
*****************************************************************
* カーソル戻す *
*****************************************************************
cursol_recv:
tst.b cur_save
beq cursol_recv9
IOCS _OS_CURON
cursol_recv9:
rts
*****************************************************************
* バッファ確保 *
*****************************************************************
buf_get:
pea.l -1.w *確保出来る最大サイズを取得
DOS _MALLOC
addq.l #4,sp
andi.l #$00ffffff,d0
move.l d0,d1
move.l d0,-(sp)
DOS _MALLOC
addq.l #4,sp
tst.l d0
bmi no_buff
move.l d0,buff_addr *バッファアドレス
move.l d1,buff_size *バッファサイズ
rts
*****************************************************************
* バッファ開放 *
*****************************************************************
buf_free:
pea.l buff_addr(pc) *バッファ開放
DOS _MFREE
addq.l #4,sp
rts
*****************************************************************
* スーパーモードにする *
*****************************************************************
super:
clr.l -(sp) *スーパーバイザモードへ移行
DOS _SUPER
addq.l #4,sp
move.l d0,sp_save
rts
*****************************************************************
* ユーザーモードにする *
*****************************************************************
user:
move.l sp_save(pc),-(sp) *ユーザーモードへ
DOS _SUPER
addq.l #4,sp
rts
*****************************************************************
* ファンクション表示を消す *
*****************************************************************
func_off:
lea.l func_off_mes(pc),a0
bsr mesput
rts
*****************************************************************
* 処理したファイル数をチェックする *
*****************************************************************
file_cnt_chk:
tst.w file_cnt *処理したファイルは0個か
bne file_cnt_chk1 *違う
bsr no_file *ファイルが無かった
file_cnt_chk1:
rts
*****************************************************************
* 処理するファイルがなかった *
*****************************************************************
no_file:
lea.l no_file_mes(pc),a0
bsr mesput
rts
*****************************************************************
* ファイル名エラー *
*****************************************************************
name_er:
lea.l name_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイルエラー *
*****************************************************************
file_er:
lea.l arg(pc),a0
bsr mesput
lea.l file_er_mes(pc),a0
bsr mesput
rts
*****************************************************************
* バージョン違い *
*****************************************************************
*no_win3_err:
* lea.l arg(pc),a0
* bsr mesput
* lea.l no_win3_mes(pc),a0
* bsr mesput
* rts
*****************************************************************
* サポートしていないBMP *
*****************************************************************
no_support_err:
lea.l arg(pc),a0
bsr mesput
lea.l no_support_mes(pc),a0
bsr mesput
rts
*****************************************************************
* 色違い *
*****************************************************************
but_col_err:
lea.l arg(pc),a0
bsr mesput
lea.l but_col_mes(pc),a0
bsr mesput
rts
*****************************************************************
* メモリが足りない *
*****************************************************************
no_buff:
lea.l arg(pc),a0
bsr mesput
lea.l no_buff_mes(pc),a0
bsr mesput
rts
*****************************************************************
* ロード座標エラー *
*****************************************************************
but_pos:
bsr file_close *ファイルクローズ
lea.l arg(pc),a0
bsr mesput
lea.l but_pos_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイルが見付からない *
*****************************************************************
open_err:
lea.l arg(pc),a0
bsr mesput
lea.l open_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 読み込みエラー *
*****************************************************************
read_err:
lea.l arg(pc),a0
bsr mesput
lea.l read_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 使用方表示 *
*****************************************************************
usage:
lea.l usage_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* メッセージ表示 *
*****************************************************************
mesput:
* move.w #STDERR,-(sp) *標準エラー出力へ
move.w #STDOUT,-(sp) *標準出力へ
move.l a0,-(sp) *メッセージを
DOS _FPUTS *出力する
addq.l #6,sp *スタック補正
rts
*****************************************************************
* 終了処理 *
*****************************************************************
exit:
bsr cursol_recv *カーソル戻す
IOCS _MS_INIT *キーバッファクリア
moveq.l #-1,d1
IOCS _SKEY_MOD
move.w #-1,-(sp)
DOS _KFLUSH
addq.l #2,sp
rts
*****************************************************************
* エラー処理2 *
*****************************************************************
exit2:
bsr exit
move.w #1,-(sp) *終了コード1を持って
DOS _EXIT2 * エラー終了
*****************************************************************
* データエリア *
*****************************************************************
.data
.even
usage_mes:
.dc.b '2,16,256,full color BMP Loader V0.08 by A.MUKAWA',CR,LF
.dc.b '機能:BMPファイルを表示します',CR,LF
.dc.b '用法:LDBMP [スイッチ] ファイル名',CR,LF
.dc.b CR,LF
.dc.b ' /L[x,y] ロード座標の指定',CR,LF
.dc.b ' /LC 画面中央に表示',CR,LF
.dc.b ' /K 表示後にキー入力待ち',CR,LF
.dc.b ' /Sn 2色,16色BMP表示の画面モード設定(n=0~4)',CR,LF
.dc.b ' 0: 768x512 31K (DEF)',CR,LF
.dc.b ' 1: 384x256 31K',CR,LF
.dc.b ' 2: 640x400 24K',CR,LF
.dc.b ' 3: 640x480 24K',CR,LF
.dc.b ' 4:1024x848 24K',CR,LF
.dc.b ' /Cn 画面クリアモードの設定(n=0~3)',CR,LF
.dc.b ' 0:画面消去を行わない',CR,LF
.dc.b ' 1:テキスト画面のみ消去(DEF)',CR,LF
.dc.b ' 2:グラフィック画面のみ消去',CR,LF
.dc.b ' 3:テキスト画面とグラフィック画面を消去',CR,LF
.dc.b ' /D ディザ表示(フルカラーBMPと/F指定の256色BMPに有効)',CR,LF
.dc.b ' /F 256色BMPを65536色モードで表示',CR,LF
.dc.b ' /M MPUに頑張ってもらう',CR,LF
.dc.b ' /H 識別ヘッダの"BM"をチェックしない',CR,LF
.dc.b ' /R 終了時に画面を描き直す',CR,LF
.dc.b ' /Wn 768x256dot 256色表示のウエイト値設定(n=0~4096)',CR,LF
.dc.b ' /N 上下逆に表示される謎の16bitBMPのときに指定',CR,LF
.dc.b CR,LF
* .dc.b ' /K指定時、画面からはみ出た部分があるとスクロール出来ます',CR,LF
* .dc.b ' 但し2色,16色ファイルは1024x1024dotまでの表示になります',CR,LF
* .dc.b ' また、以下のキー操作を行えます',CR,LF
* .dc.b " 'HOME' インフォメーション表示",CR,LF
* .dc.b " 'UNDO' 1画面表示(65536色モードのみ)",CR,LF
* .dc.b CR,LF
.dc.b ' 768x512dot 256色モードは、Oh!X 1995年11月号に掲載された',CR,LF
.dc.b ' 菊池功氏の "PageSync()関数"を使用させて頂いてます。',CR,LF
.dc.b ' 256色モードのちらつきはテンキーの"+"と"-"で調節出来ます。',CR,LF
.dc.b 0
no_file_mes:
.dc.b '表示できるファイルがありません!',CR,LF,0
name_er_mes:
.dc.b 'ファイル名の指定に間違いがあります!',CR,LF,0
file_er_mes:
.dc.b ' はBMPファイルではないようです!',CR,LF,0
open_er_mes:
.dc.b ' が見つかりません!',CR,LF,0
read_er_mes:
.dc.b ' の読み込みエラーが発生しました!',CR,LF,0
no_buff_mes:
.dc.b ' の表示に必要なメモリがありません!',CR,LF,0
but_pos_mes:
.dc.b ' は指定した座標にロード出来ません!',CR,LF,0
*no_win3_mes:
* .dc.b ' はWindows 3.x用BMPファイルではありません!',CR,LF,0
but_col_mes:
.dc.b ' は未サポートの色数です!',CR,LF,0
no_support_mes:
.dc.b ' はサポートしていないBMPフォーマットです!',CR,LF,0
wait_change_mes:
.dc.b 'ウェイト値を変更しました',CR,LF,0
crlf_mes:
.dc.b CR,LF,0
func_off_mes:
.dc.b $1b,$5b,$3e,$31,$68,0
dext:
.dc.b '.BMP',0 *補う拡張子
komekome:
.dc.b '\'
kome0:
.dc.b '*.BMP',0
wait_name:
.dc.b 'bmp256.dat',0
.even
kflg:
.dcb.b 1,0 */Kスイッチon/offフラグ(=0...off,<>0...on)
sflg:
.dcb.b 1,0 */Sスイッチon/offフラグ(=0...off,<>0...on)
cflg:
.dcb.b 1,0 */Cスイッチon/offフラグ(=0...off,<>0...on)
lflg:
.dcb.b 1,0 */Lスイッチon/offフラグ(=0...off,<>0...on)
lcflg:
.dcb.b 1,0 */LCスイッチon/offフラグ(=0...off,<>0...on)
dflg:
.dcb.b 1,0 */Dスイッチon/offフラグ(=0...off,<>0...on)
mflg:
.dcb.b 1,0 */Mスイッチon/offフラグ(=0...off,<>0...on)
fflg:
.dcb.b 1,0 */Fスイッチon/offフラグ(=0...off,<>0...on)
wflg:
.dcb.b 1,0 */Wスイッチon/offフラグ(=0...off,<>0...on)
hflg:
.dcb.b 1,0 */Hスイッチon/offフラグ(=0...off,<>0...on)
rflg:
.dcb.b 1,0 */Rスイッチon/offフラグ(=0...off,<>0...on)
nflg:
.dcb.b 1,0 */Nスイッチon/offフラグ(=0...off,<>0...on)
int_flg:
.dcb.b 1,0 *
prt_flg:
.dcb.b 1,0 *画像情報の表示/非表示フラグ
.even
s_dot4:
.dcb.w 1,8
s_dot8:
.dcb.w 1,4
s_dot24:
.dcb.w 1,8
crt_max:
.dc.w 5-1
crtc_tbl:
.dc.l mode0
.dc.l mode1
.dc.l mode2
.dc.l mode3
.dc.l mode4
.dc.l mode5
.dc.l mode6
crtc_data:
* HRL R20 R00 R01 R02 R03 R04 R05 R06 R07 R08
mode0: .dc.w $00,$416, $89, $0E, $1C, $7C,$237, $05, $28,$228, $1B * 768x512 31kHz
mode1: .dc.w $01,$411, $44, $05, $0A, $3A,$237, $05, $28,$228, $1B * 384x256 31kHz
mode2: .dc.w $00,$415, $74, $09, $14, $64,$1D0, $07, $20,$1B0, $1B * 640x400 24kHz
*mode3: .dc.w $00,$415, $72, $08, $14, $64,$1DA, $08, $1E,$1CE, $1B * 640x432 24kHz
mode3: .dc.w $00,$416, $89, $0F, $21, $71,$204, $02, $20,$200, $16 * 640x480 31kHz
mode4 .dc.w $00,$41e, $AC, $0C, $1D, $9D,$1DA, $08, $21,$1C9, $1B *1024x848 24kHz
mode5: .dc.w $00,$116, $89, $0E, $1C, $7C,$237, $05, $28,$228, $1B * 768*512 256色モード
mode6: .dc.w $00,$316, $89, $0E, $2C, $6C,$237, $05, $28,$228, $1B * 512*512 64k色モード
dot_tbl:
.dc.l dot0
.dc.l dot1
.dc.l dot2
.dc.l dot3
.dc.l dot4
.dc.l dot5
.dc.l dot6
dot_data:
dot0: .dc.w 768,512
dot1: .dc.w 384,256
dot2: .dc.w 640,400
dot3: .dc.w 640,480
dot4: .dc.w 1024,848
dot5: .dc.w 768,512
dot6: .dc.w 512,512
col1: .dc.b '2',0
col4: .dc.b '16',0
col8: .dc.b '256',0
col16: .dc.b '32k',0
col24: .dc.b 'full',0
col??: .dc.b '????',0
inf1: .dc.b 'ファイル名:',0
inf2: .dc.b '画像サイズ:',0
inf3: .dc.b '色数 :',0
.even
d_pat:
.dc.b 0, 4, 1, 5 *ディザパターン1
.dc.b 6, 2, 7, 3
.dc.b 1, 5, 0, 4
.dc.b 7, 3, 6, 2
* .dc.b 0, 4, 1, 5 *ディザパターン1'
* .dc.b 7, 3, 6, 2
* .dc.b 1, 5, 0, 4
* .dc.b 6, 2, 7, 3
* .dc.b 4, 6, 4, 6 *ディザパターン2(LDBMP Ver2互換)
* .dc.b 0, 2, 0, 2
* .dc.b 4, 6, 4, 6
* .dc.b 0, 2, 0, 2
*****************************************************************
* ワークエリア *
*****************************************************************
.bss
.even
filbuf:
.ds.b 53 *ファイル情報格納バッファ
nambuf:
.ds.b 92 *ファイル名展開用バッファ
arg:
.ds.b 256 *ファイル名バッファ
arg2:
.ds.b 256 *'bmp256.dat'用バッファ
prt_buf:
.ds.b 96+3 *画面表示バッファ
num_buf:
.ds.b 10+1 *数値変換バッファ
.even
file_cnt:
.ds.w 1 *ファイル数のカウント用バッファ
sp_save:
.ds.l 1
buff_addr:
.ds.l 1 *画像読み込みバッファアドレス
buff_size:
.ds.l 1 *画像読み込みバッファサイズ
pal_addr:
.ds.l 1 *パレットアドレス
gr_addr:
.ds.l 1 *画像データアドレス
fi_size:
.ds.l 1 *ファイルサイズ
os_type:
.ds.w 1 *OSのタイプ
pal_cnt:
.ds.w 1 *パレット数
yoko:
.ds.w 1 *画像の横(X)サイズ
tate:
.ds.w 1 *画像の縦(Y)サイズ
iro:
.ds.w 1 *使用色数(BIT)
compress:
.ds.w 1 *圧縮モード
line_byte:
.ds.w 1 *1ラインのバイト数
crt_x:
.ds.w 1 *画面のXサイズ
crt_y:
.ds.w 1 *画面のYサイズ
x_pos:
.ds.w 1 *ロード時のX座標
y_pos:
.ds.w 1 *ロード時のY座標
x_max:
.ds.w 1 *横スクロール数
y_max:
.ds.w 1 *縦スクロール数
crt_mode:
.ds.w 1 *画面モード
clr_mode:
.ds.w 1 *画面クリアモード
bit4_crtdef:
.ds.w 1 *16色BMPの画面モード
vctr_r0:
.ds.w 1
vctr_r2:
.ds.w 1
line_cnt:
.ds.w 1
esc_flg:
.ds.b 1 *
skip_flg:
.ds.b 1 *
next_flg:
.ds.b 1 *
resize_flg:
.ds.b 1 *
inkey_flg1:
.ds.b 1 *
inkey_flg2:
.ds.b 1 *
inkey_flg3:
.ds.b 1 *
scroll_key:
.ds.b 1 *スクロール処理のキー
cur_save:
.ds.b 1 *
.even
wait:
.ds.w 1 *768x512 256モードのウェイトワーク
my_stack:
.ds.l 1024
mysp:
.end start